#ifndef THREADPOOL_H
#define THREADPOOL_H
#include<my_header.h>


typedef struct {
    void (*function)(void *);
    void *arg;
} Task;

typedef struct ThreadPool {
    // 任务队列
    Task* taskQ;
    int queueCapacity;  // 容量
    int queueSize;      // 当前任务个数
    int queueFront;     // 队头 -> 取数据
    int queueRear;      // 队尾 -> 放数据

    pthread_t managerID;    // 管理者线程ID
    pthread_t* threadIDs;   // 工作的线程ID

    int minNum;         // 最小线程数
    int maxNum;         // 最大线程数
    int busyNum;        // 忙的线程数
    int liveNum;        // 存活的线程数
    int exitNum;        // 要销毁的线程个数

    pthread_mutex_t mutexPool;  // 锁整个线程池
    pthread_mutex_t mutexBusy;  // 锁busyNum变量
    pthread_cond_t notEmpty;    // 任务队列是不是空了
    pthread_cond_t notFull;     // 任务队列是不是满了

    int shutdown;       // 是否要销毁线程池，销毁为1，不销毁为0
} ThreadPool;

// 创建线程池
ThreadPool* threadPoolCreate(int min, int max, int queueSize);

// 销毁线程池
void threadPoolDestroy(ThreadPool* pool);

// 给线程池添加任务
void threadPoolAdd(ThreadPool* pool, void(*func)(void*), void* arg);

// 获取线程池中工作的线程个数
int threadPoolBusyNum(ThreadPool* pool);

// 获取线程池中活着的线程个数
int threadPoolLiveNum(ThreadPool* pool);

// 声明线程退出函数
void threadExit(ThreadPool* pool);
void* worker(void* arg);
void* manager(void* arg);

#endif